package com.aco.fatureapp.printer.libs;

import java.io.IOException;
import java.util.Set;

import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.Typeface;
import android.util.Log;

import com.aco.fatureapp.model.printer.Billing;
import com.aco.fatureapp.model.printer.Historic;
import com.aco.fatureapp.model.printer.Products;

public class Printer {

	public Bluetooth mBth = new Bluetooth();
	Bitmap mBitmap = null;
	static Bitmap mBitmapFundo = null;
	Integer mDensity = 10;

	public boolean closeBth() {
		if (mBth.isConnected()) {
			return mBth.Close();
		}
		return false;
	}

	public boolean checkBth(Context context) {
		if (!mBth.isConnected()) {
			if (!mBth.Enable()) {
				return false;
			}
			String mac = null;
			Set<BluetoothDevice> devices = mBth.GetBondedDevices();
			for (BluetoothDevice device : devices) {
				if ("MPT-III".equals(device.getName())) {
					mac = device.getAddress();
				}
			}
			if (mac == null) {
				return false;
			}
			if (!mBth.Open(mac)) {
				return false;
			}
		}
		return true;
	}

	public Bitmap gerar(Context context, Billing billing, boolean isBackground) {
		// Pegar o fundo por enquando pra facilitar.
		try {
			int eixoX = 0, eixoY = 0, w = 576, h = w * 5;

			int size_text = 32, size_legend = 22;

			Paint fontTitleBold = new Paint(Color.BLACK);
			fontTitleBold.setTypeface(Typeface.create(Typeface.SANS_SERIF,
					Typeface.BOLD));
			fontTitleBold.setTextSize((int) (size_text * 1.2));

			Paint fontText = new Paint(Color.BLACK);
			fontText.setTypeface(Typeface.create(Typeface.SANS_SERIF,
					Typeface.NORMAL));
			fontText.setTextSize((size_text));

			Paint fontTextBold = new Paint(Color.BLACK);
			fontTextBold.setTypeface(Typeface.create(Typeface.SANS_SERIF,
					Typeface.BOLD));
			fontTextBold.setTextSize((size_text));

			Paint fontLegend = new Paint(Color.BLACK);
			fontLegend.setTypeface(Typeface.create(Typeface.SANS_SERIF,
					Typeface.NORMAL));
			fontLegend.setTextSize(size_legend);

			Paint fontLegend2 = new Paint(Color.BLACK);
			fontLegend2.setTypeface(Typeface.create(Typeface.SANS_SERIF,
					Typeface.NORMAL));
			fontLegend2.setTextSize(size_legend);
			fontLegend2.setTextAlign(Align.RIGHT);

			Paint fontLegendBold = new Paint(Color.BLACK);
			fontLegendBold.setTypeface(Typeface.create(Typeface.SANS_SERIF,
					Typeface.BOLD));
			fontLegendBold.setTextSize(size_legend);

			Paint p = new Paint(Color.TRANSPARENT);
			p.setStyle(Style.STROKE);
			p.setStrokeWidth(2);

			// ------------------------------------------------
			// Bitmap não rotacionado usado para Fatura
			// ------------------------------------------------
			Bitmap bitmapFatura = Bitmap.createBitmap(w, 2980, Config.RGB_565);

			if (isBackground) {
				mBitmapFundo = BitmapFactory.decodeStream(context.getAssets()
						.open("fatura_572.png"));

				bitmapFatura = Bitmap.createBitmap(mBitmapFundo.getWidth(),
						mBitmapFundo.getHeight(), Config.RGB_565);
			}

			Canvas canvas = new Canvas(bitmapFatura);

			canvas.drawColor(Color.WHITE);

			if (isBackground) {
				canvas.drawColor(Color.TRANSPARENT);
			}

			canvas.drawBitmap(bitmapFatura, 0, 0, p);

			if (isBackground) {
				canvas.drawBitmap(mBitmapFundo, 0, 0, p);
			}

			eixoY = gerarConta(billing, eixoY, size_text, fontTitleBold,
					fontLegend, fontLegend2, canvas);

			// ------------------------------------------------
			// Bitmap rotacionado usado para Boletos
			// ------------------------------------------------
			gerarCodigoBarra(billing, p, canvas, fontLegend);

			// ------------------------------------------------

			// Gerar a imagem toda.
			eixoX = 0;
			eixoY += 1000;

			h = eixoY / 64;
			h = ((h + 1) * 64);

			Bitmap BitmapReturn = Bitmap.createBitmap(bitmapFatura.getWidth(),
					bitmapFatura.getHeight(), Config.RGB_565);

			if (isBackground) {
				BitmapReturn = Bitmap.createBitmap(mBitmapFundo.getWidth(),
						mBitmapFundo.getHeight(), Config.RGB_565);
			}

			Canvas g3 = new Canvas(BitmapReturn);

			g3.drawBitmap(bitmapFatura, 0, 0, p);

			return BitmapReturn;
		}
		catch (IOException e) {
			Log.d("Erro geração fatura", e.getMessage());

			return null;
		}
	}

	private int gerarConta(Billing billing, int eixoY, int size_text,
			Paint fontTitleBold, Paint fontLegend, Paint fontLegend2,
			Canvas canvas) {
		int eixoX;
		eixoX = 30;
		eixoY += 270;
		canvas.drawText(billing.inscricao, 40, eixoY, fontTitleBold);

		canvas.drawText(billing.competencia, 410, eixoY + 6, fontTitleBold);

		eixoY += 80;
		canvas.drawText(billing.nomeCliente, eixoX, eixoY, fontLegend);

		eixoY += size_text;
		canvas.drawText(billing.endereco, eixoX, eixoY, fontLegend);

		eixoY += size_text;
		canvas.drawText(billing.bairro + " - " + billing.cidade + " - "
				+ billing.uf, eixoX, eixoY, fontLegend);

		eixoY += size_text;
		canvas.drawText(billing.leiturista, eixoX, eixoY, fontLegend);

		eixoY = 570;
		canvas.drawText(billing.classe, eixoX + 60, eixoY, fontLegend);

		canvas.drawText(billing.a_e, eixoX + 160, eixoY, fontLegend);

		eixoY = 600;
		canvas.drawText(billing.tarifa, eixoX + 50, eixoY, fontLegend);

		canvas.drawText(billing.economias, eixoX + 200, eixoY, fontLegend);

		eixoY += size_text;
		canvas.drawText(billing.localizacao, eixoX + 80, eixoY, fontLegend);

		eixoY += size_text + 25;
		canvas.drawText(billing.hidrometro, eixoX, eixoY, fontLegend);

		canvas.drawText(billing.dataInstalacao, eixoX + 200, eixoY,
				fontLegend);

		eixoY += size_text + 65;
		canvas.drawText("", eixoX, eixoY, fontLegend);

		canvas.drawText(billing.leituraAnterior, eixoX + 150, eixoY,
				fontLegend);

		eixoY += size_text + 22;
		canvas.drawText(billing.dataLeitura, eixoX, eixoY, fontLegend);

		canvas.drawText(billing.leituraAtual, eixoX + 150, eixoY,
				fontLegend);

		eixoY += size_text + 20;
		canvas.drawText(billing.diasConsumo, eixoX, eixoY, fontLegend);

		canvas.drawText(billing.consumo, eixoX + 150, eixoY, fontLegend);

		eixoY += size_text + 30;
		canvas.drawText(billing.media, eixoX + 90, eixoY - 20, fontLegend);

		canvas.drawText(billing.ocorrencia, eixoX + 290, eixoY, fontLegend);

		eixoY += size_text + 30;
		canvas.drawText(billing.mensagem1 != null ? billing.mensagem1 : "",
				eixoX, eixoY, fontLegend);

		eixoY += size_text;
		canvas.drawText(billing.mensagem2 != null ? billing.mensagem2 : "",
				eixoX, eixoY, fontLegend);

		eixoY += size_text;
		canvas.drawText(billing.mensagem3 != null ? billing.mensagem3 : "",
				eixoX, eixoY, fontLegend);

		eixoY += size_text;
		canvas.drawText(billing.mensagem4 != null ? billing.mensagem4 : "",
				eixoX, eixoY, fontLegend);

		Historic[] historics = billing.historics;

		eixoY = 615;

		for (int index = 1; index <= historics.length; index++) {

			Historic historic = historics[index - 1];

			canvas.drawText(
					historic.competencia != null ? historic.competencia
							: "", eixoX + 280, eixoY, fontLegend);

			canvas.drawText(historic.consumo != null ? historic.consumo
					: "", eixoX + 390, eixoY, fontLegend);

			canvas.drawText(
					historic.ocorrencia != null ? historic.ocorrencia : "",
					eixoX + 500, eixoY, fontLegend);

			eixoY += size_text;
		}

		eixoY = 1170;

		Paint fontLegendValor = new Paint(Color.BLACK);
		fontLegendValor.setTypeface(Typeface.create(Typeface.SANS_SERIF,
				Typeface.NORMAL));
		fontLegendValor.setTextSize(12);
		fontLegendValor.setTextAlign(Align.RIGHT);

		Paint fontLegendMenor = new Paint(Color.BLACK);
		fontLegendMenor.setTypeface(Typeface.create(Typeface.SANS_SERIF,
				Typeface.NORMAL));
		fontLegendMenor.setTextSize(12);

		Products[] products = billing.products;

		for (int index = 1; index <= products.length; index++) {

			Products product = products[index - 1];

			eixoY += size_text;
			canvas.drawText(
					product.codigo != null ? getZeroEsq(product.codigo, 5)
							: "", eixoX + 20, eixoY, fontLegendMenor);

			canvas.drawText(product.descricao != null ? product.descricao
					: "", eixoX + 80, eixoY, fontLegendMenor);

			canvas.drawText(product.parcela != null ? product.parcela : "",
					eixoX + 390, eixoY, fontLegendMenor);

			canvas.drawText(product.valor != null ? product.valor : "",
					540, eixoY, fontLegendValor);
		}

		eixoY = 1585;

		Paint fontTitleBoldValor = new Paint(Color.BLACK);
		fontTitleBoldValor.setTypeface(Typeface.create(Typeface.SANS_SERIF,
				Typeface.BOLD));
		fontTitleBoldValor.setTextAlign(Align.RIGHT);
		fontTitleBoldValor.setTextSize((int) (size_text * 1.2));

		canvas.drawText(billing.dataVencimento, 100, eixoY,
				fontTitleBoldValor);

		canvas.drawText(billing.totalConta, 545, eixoY, fontTitleBoldValor);

		eixoY = 1670;
		canvas.drawText(billing.multa, eixoX + 100, eixoY, fontLegend2);
		canvas.drawText(billing.valor, eixoX + 260, eixoY, fontLegend2);
		canvas.drawText(billing.jurosDiarios, eixoX + 480, eixoY,
				fontLegend2);

		eixoY = 1745;
		canvas.drawText(billing.reservatorio, eixoX + 110, eixoY,
				fontLegend);
		canvas.drawText(billing.dataColeta, eixoX + 390, eixoY, fontLegend);

		eixoY += size_text + 60;
		canvas.drawText(billing.reserCampo1, eixoX + 110, eixoY,
				fontLegendMenor);
		canvas.drawText(billing.reserCampo2, eixoX + 170, eixoY,
				fontLegendMenor);
		canvas.drawText(billing.reserCampo3, eixoX + 240, eixoY,
				fontLegendMenor);
		canvas.drawText(billing.reserCampo4, eixoX + 290, eixoY,
				fontLegendMenor);
		canvas.drawText(billing.reserCampo5, eixoX + 380, eixoY,
				fontLegendMenor);
		canvas.drawText(billing.reserCampo6, eixoX + 460, eixoY,
				fontLegendMenor);
		return eixoY;
	}

	private Canvas gerarCodigoBarra(Billing billing, Paint p, Canvas canvas,
			Paint fontText) {
		int eixoX;
		int eixoY;
		int W = 1000, H = 900;

		Bitmap bitmapCodigoBarra = Bitmap.createBitmap(H, W, Config.ARGB_4444);

		Canvas canvasCodigoBarra = new Canvas(bitmapCodigoBarra);

		canvasCodigoBarra.rotate(90, H / 2, H / 2);

		canvasCodigoBarra.drawText(billing.inscricao, 120, 550, fontText);

		canvasCodigoBarra.drawText(billing.leiturista, 480, 550, fontText);

		canvasCodigoBarra.drawText(billing.nomeCliente, 130, 580, fontText);

		canvasCodigoBarra.drawText(billing.inscricao, 50, 600, fontText);

		canvasCodigoBarra.drawText(billing.competencia, 240, 600, fontText);

		canvasCodigoBarra.drawText(billing.dataVencimento, 460, 600, fontText);

		canvasCodigoBarra.drawText(billing.totalConta, 700, 600, fontText);

		canvasCodigoBarra.drawText(billing.codigoBarrasComDigito, 45, 790,
				fontText);

		// canvasCodigoBarra.drawText(billing.leiturista, 45, 340, fontText);

		eixoX = 0;
		eixoY = 0;

		BarI25 b25 = new BarI25();

		Bitmap i25 = b25.createI25(billing.getCodigoBarras());

		canvasCodigoBarra.drawBitmap(i25, 10, H - 90, p);

		// ------------------------------------------------
		eixoX = 35;
		eixoY = 2000;
		canvas.drawBitmap(bitmapCodigoBarra, eixoX, eixoY, null);

		return canvasCodigoBarra;
	}

	/**
	 * Método que inclui espaços em uma string caso ela tenha menos caracteres
	 * que o especificado
	 */
	public static String getEspacoDir(String palavra,
			final Integer tamanhoMaximo) {
		if (palavra == null) {
			palavra = " ";
		}

		int tamanho = palavra.length();
		if (tamanho > tamanhoMaximo) {
			return palavra.substring(0, tamanhoMaximo);
		}

		if (tamanho < tamanhoMaximo) {
			for (int i = tamanho; i < tamanhoMaximo; i++) {
				// Adicionando espaço ao início da String
				palavra = palavra.concat(" ");
			}
		}
		return palavra;
	}

	public static String getEspacoEsq(String palavra,
			final Integer tamanhoMaximo) {
		if (palavra == null) {
			palavra = " ";
		}

		int tamanho = palavra.length();
		if (tamanho < tamanhoMaximo) {
			for (int i = tamanho; i < tamanhoMaximo; i++) {
				// Adicionando espaço ao início da String
				palavra = " ".concat(palavra);
			}
		}
		return palavra;
	}

	public static Integer getPosicao(String palavra, final Integer tamanhoMaximo) {

		if (palavra == null) {
			return 0;
		}

		return tamanhoMaximo - palavra.length();
	}

	public static String getZeroEsq(String palavra, final Integer tamanhoMaximo) {
		if (palavra == null) {
			return palavra = "";
		}

		int tamanho = palavra.length();
		if (tamanho < tamanhoMaximo) {
			for (int i = tamanho; i < tamanhoMaximo; i++) {
				// Adicionando espaço ao início da String
				palavra = "0".concat(palavra);
			}
		}
		return palavra;
	}

}
